在迷宫问题中,假设只能往四个方向进行转移,0表示可通,1表示有障碍,每次有四次选择,但为了避免陷入死循环,即类似于无向图中的来回,故设置访问标记,这里既可以另开辟标记数组,也可以用迷宫数组。
队列解决问题时,有点类似于dfs的味道,首先将出发点进入队列,从此节点开始探索,由它产生的可能四个方向的新状态其父节点为首节点,这方便与轨迹的输出,在由其依次往下搜。。
附上代码
#include<iostream>
using namespace std;
int m=7; //终点的横坐标
int n=7; //终点的纵坐标
int Maze[8][9]={ //迷宫数组
{1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,1,1,0,1},
{1,1,0,0,1,1,1,1,1},
{1,1,0,0,0,1,1,1,1},
{1,1,1,1,0,1,1,1,1},
{1,1,1,1,0,0,1,0,1},
{1,1,1,1,1,0,1,1,1},
{1,1,1,1,1,0,0,0,1},
};
int mark[8][9]; //标记数组
struct State //状态
{
int x,y;
int pre;
};
struct D //移动方向
{
int x,y;
};
D d[5]={{0,0},{1,0},{0,1},{-1,0},{0,-1}};
State SQueue[1000];
void print(int s)
{
int i,j,k=s;
do
{
i=SQueue[k].x;
j=SQueue[k].y;
Maze[i][j]=3;
k=SQueue[k].pre;
}while(k);
for(i=0;i<8;++i)
{
for(j=0;j<9;++j)
if(Maze[i][j]==3) cout<<"# ";
else cout<<Maze[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int front,rear,Goout,i,j,k,di,dj;
front=rear=0;
rear++;
SQueue[rear].x=1;
SQueue[rear].y=1;
SQueue[rear].pre=0;
do
{
front++;
i=SQueue[front].x;
j=SQueue[front].y;
if(i==m&&j==n)
{print(front);
cout<<endl;
}
mark[i][j]=1;
for(k=1;k<=4;++k)
{
di=d[k].x+i;
dj=d[k].y+j;
if(!Maze[di][dj]&&!mark[di][dj])
{
rear++;
SQueue[rear].x=di;
SQueue[rear].y=dj;
SQueue[rear].pre=front;
}
}
}while(front<rear);
// system("pause");
}